package com.xzr.demo.mqserver.datacenter;

import com.xzr.demo.common.MqException;
import com.xzr.demo.mqserver.core.Binding;
import com.xzr.demo.mqserver.core.Exchange;
import com.xzr.demo.mqserver.core.MSGQueue;
import com.xzr.demo.mqserver.core.Message;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * 来管理所有硬盘上的数据
 * 1. 数据库 ：交换机、绑定、队列
 * 2. 数据文件：消息
 *
 * 上层逻辑如果需要操作硬盘，统一都通过这个类来使用，（上层代码不关心当前数据是存储在数据库还是文件中的）
 * @Author：徐志荣
 * @Date：2023/8/11 下午 5:19
 */
public class DiskDataCenter {
    //管理数据库中的数据
    private DataBaseManager dataBaseManager = new DataBaseManager();
    //管理数据文件中的数据
    private MessageFileManager messageFileManager = new MessageFileManager();

    public void init(){
        //针对上述连个实例进行初始化
        dataBaseManager.init();

        messageFileManager.init();
    }
    /**
    * 封装交换机操作、删除交换机、查询所有交换机
    * @param exchange
    * @return
    */
    public void insertExchange(Exchange exchange){
        dataBaseManager.insertExchange(exchange);
    }
    public  void deleteExchange(String exchangeName){
        dataBaseManager.deleteExchange(exchangeName);
    }
    public List<Exchange> selectAllExchanges(){
       return dataBaseManager.selectAllExchanges();
    }

    /**
    * 封装队列操作、删除队列、查询所有队列
    * @param
    * @return
    */
    public void insertQueue(MSGQueue queue) throws Exception {
        dataBaseManager.insertQueue(queue);
        //创建队列的同时，不仅仅是把队列队形写到数据库中，还需要创建出对应的目录和文件
        messageFileManager.createQueueFiles(queue.getName());
    }

    public void deleteQueue(String queueName) throws IOException {
      dataBaseManager.deleteQueue(queueName);
      //删除队列的同时，不仅仅是是把队列从数据库中删除，还需要删除对应的目录和文件
        messageFileManager.destroyQueueFiles(queueName);

    }
    public List<MSGQueue> selectAllQueues(){
      return  dataBaseManager.selectAllQueues();
    }

    /**
    * 封装绑定操作、删除绑定、查询所有绑定
    * @param
    * @return
    */
    public void insertBinding(Binding binding){
      dataBaseManager.insertBinding(binding);
    }
    public void deleteBinding(Binding binding){
       dataBaseManager.deleteBinding(binding);
    }
    public List<Binding> selectAllBindings(){
        return dataBaseManager.selectAllBindings();
    }

    /**
    * 封装消息、删除消息、查询消息
    * @param queue
    * @param message
    * @return
    */
    public void sendMessage(MSGQueue queue, Message message) throws MqException, IOException {
        messageFileManager.sendMessage(queue,message);
    }

    public void deleteMessage(MSGQueue queue,Message message) throws IOException, ClassNotFoundException, MqException {
        messageFileManager.deleteMessage(queue,message);
        // 垃圾回收判定
        if(messageFileManager.checkGC(queue.getName())){
            messageFileManager.gc(queue);
        }
    }

    public LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException {
        return messageFileManager.loadAllMessageFromQueue(queueName);
    }


    }
